\documentclass[12pt, a4paper]{article}
\usepackage{geometry}
\geometry{
	a4paper,
	left=12.7 mm,
	right=12.7 mm,
	top=12.7 mm,
	bottom=12.7 mm,
}
\usepackage{graphicx}
\usepackage{amsmath}
\usepackage{physics}
\graphicspath{ {./} }
\usepackage{ctex}
\usepackage{tikz}

\newcommand{\bvec}[1]{\ensuremath{\mathbf{#1}}}
\newcommand{\formula}[1]{\text{式} \ref{#1} }

\begin{document}
	\section{线性平流方程}
	\footnote{参考：https://encyclopediaofmath.org/wiki/Lax-Wendroff\_method}
	线性平流方程(Linear Advection Equation)具有如下形式：
	\begin{equation}
		u = u(x, t), 
		\left \{
		\begin{aligned}
			\pdv{u}{t} + v \pdv{u}{x} & = 0 \qquad \text{线性平流方程}\\
			u(x,t_0) &= f(x) \qquad \text{初始条件}\\
			u(x_0,t) & = u(x_n, t) \qquad \text{周期性边界条件} \\
			x & \in [x_0, x_n]\\
			t & \ge t_0 \\
		\end{aligned}
		\right.
	\end{equation}
	线性平流方程相当于以速率$v$“平移”初始条件$u(x,t=t_0)$。
	我们仍想离散化这个方程。
	线性平流方程对于时间和空间都是一阶导数、其结构似乎比扩散、波动方程都简单。
	但看似人畜无害的背后却暗藏玄机，如果我们想当然地直接离散化：
	$$
	\text{错误！} \qquad u^{(k+1)}_{i}  = u^{(k)}_{i} + v \frac{u^{(k)}_{i+1}  - u^{(k)}_{i-1}}{2 \Delta x}\\
	$$
	那么我们就错了：即使步长很小，这个迭代也将发散。
	数学地说，这个迭代格式是无条件不稳定的。
	比较聪明的方法是使用Lax-Wendroff方法。
	
	\subsection{一个小结论}
	在此之前，我们先引入一个小结论：
	对线性平流方程再分别关于$x, t$求导
	\begin{equation} \label{eq_linearadv}
		\pdv{u}{t} + v \pdv{u}{x} = 0
	\end{equation}
	得到
	\begin{equation} \label{eq_linearadv_t}
		\frac{\partial^2 u}{\partial x \partial t} + v \pdv[2]{u}{x}= 0
	\end{equation}
	\begin{equation} \label{eq_linearadv_x}
		\pdv[2]{u}{t} + v \frac{\partial^2 u}{\partial t \partial x} = 0
	\end{equation}
	我们假定$u$是好函数，因此二阶导可交换顺序 
	$\frac{\partial^2 u}{\partial x \partial t} = \frac{\partial^2 u}{\partial t \partial x}$ 。
	连立 \formula{eq_linearadv_t}，\formula{eq_linearadv_x}，得到
	\begin{equation} \label{eq_linearadv_xt}
		\pdv[2]{u}{t} = v^2 \pdv[2]{u}{x}
	\end{equation}
	
	\subsection{Lax-Wendroff 法}
	我们对$u(x,t+\dd t)$做Taylor展开
	\begin{equation}
		u(x,t+\dd t) \approx u(x, t) + \pdv{u}{t} \dd t + 1/2 \pdv[2]{u}{t} ~ {(\dd t)}^2
	\end{equation}
	比较神奇的操作来了：将\formula{eq_linearadv}与\formula{eq_linearadv_xt}代入，得到
	\begin{equation}
		u(x,t+\dd t) \approx u(x, t) - v\pdv{u}{x} \dd t + 1/2 v^2 \pdv[2]{u}{x} ~ {(\dd t)}^2
	\end{equation}
	然后再离散化：
	\begin{equation}
		u^{(k+1)}_{i}  = u^{(k)}_{i} 
		- v \frac{\Delta t}{2 \Delta x} (u^{(k)}_{i+1}  - u^{(k)}_{i-1})
		+ 1/2 v^2 (\frac{\Delta t}{\Delta x})^2  (u^{(k)}_{i+1}  - 2u^{(k)}_{i} + u^{(k)}_{i-1})
	\end{equation}
	整理得
	\begin{equation}
		u^{(k+1)}_{i}  = 
		(v \frac{\Delta t}{2\Delta x}  + 1/2 v^2 (\frac{\Delta t}{\Delta x})^2 ) u^{(k)}_{i-1}
		+ (1 - v^2 (\frac{\Delta t}{\Delta x})^2 )u^{(k)}_{i} 
		+ (- v \frac{\Delta t}{2\Delta x}  + 1/2 v^2 (\frac{\Delta t}{\Delta x})^2) u^{(k)}_{i+1} 
	\end{equation}
	即
	\begin{equation}
		u^{(k+1)}_{i}  = 1/2c(1+c) u^{(k)}_{i-1} + (1-c^2) u^{(k)}_{i}  - 1/2c(1-c) u^{(k)}_{i+1} 
		\qquad c = v \frac{\Delta t}{\Delta x}  
	\end{equation}
	该式即为Lax-Wendroff方法。在恰当的步长下可以避免迭代发散。
	关于该方法的其他推导方法可以参考原始论文，或者论坛讨论\footnote{https://zhuanlan.zhihu.com/p/146122878}。
	
	\newpage
	\subsection{半格 Lax-Wendroff 法}
	\footnote{参考：K.W. Morton et al. 《偏微分方程数值解》}
	
	\begin{figure}[h]
		\centering
		\includegraphics[width=0.5 \linewidth]{laxwendroff}
		\caption{示意图}
		\label{fig:laxwendroff}
	\end{figure}
	
	
	Lax-Wendroff法还有另一种写法，“半格 Lax-Wendroff法”（这不是一个严格的专有名词）。
	类似速度Verlet法，半格 Lax-Wendroff法使用了假想的、半整数空间和时间格点处的$u$。
	\begin{itemize}
		\item 首先我们使用$u^{(k)}_{i-1}, u^{(k)}_i,u^{(k)}_{i+1}$估算$k+1/2$时刻、$i \pm 1/2$格点处的$u$，即$u^{(k+1/2)}_{i \pm 1/2}$（图中蓝色线）：
		\begin{equation}
			\begin{cases}
				\frac{u^{(k+1/2)}_{i+1/2} - \frac{u^{(k)}_{i+1} + u^{(k)}_{i}}{2}}{\Delta t / 2} &= v \frac{u^{(k)}_{i+1} - u^{(k)}_{i}}{\Delta x} \\
				\frac{u^{(k+1/2)}_{i-1/2} - \frac{u^{(k)}_{i} + u^{(k)}_{i-1}}{2}}{\Delta t / 2} &= v \frac{u^{(k)}_{i} - u^{(k)}_{i-1}}{\Delta x} \\
			\end{cases}
		\end{equation}
		其中 $u^{(k)}_{i+1/2} =  \frac{u^{(k)}_{i+1} + u^{(k)}_{i}}{2}$ 相当于在$k$时刻使用$u$在临近整数格点的平均值估算同时刻$u$在半整数格点的值。
		严格来说这两个方程是“相同”（只需做$i \to i-1$的代换就能从第一个方程得到第二个）的，但是为了清晰，我们同时列出二者。
		\item 随后，使用$u^{(k+1/2)}_{i \pm 1/2}$估算$u^{(k+1)}_i$（图中橙色线）：
		\begin{equation}
			\frac{u^{(k+1)}_i - u^{(k)}_i}{\Delta t} = v (\frac{u^{(k+1/2)}_{i+1/2} - u^{(k+1/2)}_{i-1/2}}{\Delta x})
		\end{equation}
		至此，我们完成了$k \to k+1$的一次时间步迭代。
	\end{itemize}
	根据上述推导，我们总结半格Lax-Wendroff方程的形式：
	\begin{equation}
		\begin{cases}
			\frac{u^{(k+1/2)}_{i+1/2} - \frac{u^{(k)}_{i+1} + u^{(k)}_{i}}{2}}{\Delta t / 2} &= v \frac{u^{(k)}_{i+1} - u^{(k)}_{i}}{\Delta x} \\
			\frac{u^{(k+1/2)}_{i-1/2} - \frac{u^{(k)}_{i} + u^{(k)}_{i-1}}{2}}{\Delta t / 2} &= v \frac{u^{(k)}_{i} - u^{(k)}_{i-1}}{\Delta x} \\
			\frac{u^{(k+1)}_i - u^{(k)}_i}{\Delta t} &= v (\frac{u^{(k+1/2)}_{i+1/2} - u^{(k+1/2)}_{i-1/2}}{\Delta x}) \\
		\end{cases}
		\Rightarrow
		\begin{cases}
			u^{(k+1/2)}_{i+1/2} &= \frac{1+c}{2}u^{(k)}_{i+1} + \frac{1-c}{2}u^{(k)}_{i} \\
			u^{(k+1/2)}_{i+1/2} &= \frac{1+c}{2}u^{(k)}_{i} + \frac{1-c}{2}u^{(k)}_{i-1} \\
			u^{(k+1)}_i &= u^{(k)}_i + c (u^{(k+1/2)}_{i+1/2}-u^{(k+1/2)}_{i-1/2})
		\end{cases}
	\end{equation}
	其中$c = v \frac{\Delta t}{\Delta x}$。
	如果我们继续合并这几个方程，那么我们将重新得到上述原始的Lax-Wendroff法，
	半格点$u^{(k+1/2)}_{i \pm 1/2}$实则只充当中间变量。
	尽管在线性平流方程中二者形式相同，但在非线性方程中二者可能不同。
	虽然半格Lax-Wendroff方程引入了更多的方程和假想的半整数格点，但计算思路更为清晰明了，也容易拓展到浅水方程等更复杂的问题。
	
	半格Lax Wendroff 巧妙地引入了$i \pm 1/2$处的值，使空间导数$\frac{u^{(k+1/2)}_{i+1/2} - u^{(k+1/2)}_{i-1/2}}{\Delta x}$形式上具有二阶精度。
	看起来，$\pdv{u}{x}$的离散化充满挑战：单侧差分（$\frac{u_{i+1}-u_{i}}{\Delta x}$）精度不足，而中心差分（$\frac{u_{i+1}-u_{i-1}}{2 \Delta x}$）容易发散，
	因此一般需要使用类似Lax-Wendroff方法的技巧构造更稳定精确的一阶导形式。
	相较之下，$\pdv[2]{u}{x}$的离散化反而容易得多，但在扩散方程$\pdv{u}{t} = D\pdv[2]{u}{x}$中，显式格式的稳定性要求很小的$\Delta t$（$\Delta t \approx (\Delta x)^2$），这又要求我们寻找隐式法或者CN法，哈哈。
	
\end{document}



